import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import load_model


def load_and_predict(model_path, data_path, target_date_str):
    # 读取数据
    data = pd.read_excel(data_path, parse_dates=['date'], index_col='date')

    # 打印数据集的范围
    print("数据集范围:")
    print(f"开始日期: {data.index.min()}")
    print(f"结束日期: {data.index.max()}")

    # 转换目标日期
    target_date_dt = pd.to_datetime(target_date_str)
    print(f"目标日期: {target_date_dt}")

    # 确保有足够的数据
    start_time = target_date_dt - pd.Timedelta(hours=10)
    end_time = target_date_dt - pd.Timedelta(hours=1)
    print(f"需要的数据范围: 从 {start_time} 到 {end_time}")

    if start_time < data.index.min():
        raise ValueError("数据不足以进行预测。")

    # 提取目标日期之前的10小时数据
    past_hours_data = data.loc[start_time:end_time]
    print(f"提取到的数据:\n{past_hours_data}")

    if past_hours_data.empty:
        raise ValueError("时间范围内没有足够的数据进行预测。")

    # 标准化处理
    scaler = MinMaxScaler(feature_range=(0, 1))
    temperature_scaled = scaler.fit_transform(data['temperature'].values.reshape(-1, 1))

    # 创建数据集函数
    def create_dataset(data, time_step=1):
        X = []
        for i in range(len(data) - time_step):
            X.append(data[i:(i + time_step), 0])
        return np.array(X)

    time_step = 10  # 时间步长

    # 加载模型
    model = load_model(model_path)

    # 标准化过去10小时数据并调整形状
    past_hours_data_scaled = scaler.transform(past_hours_data['temperature'].values.reshape(-1, 1))
    past_hours_data_scaled = past_hours_data_scaled.reshape(1, time_step, 1)

    # 进行预测
    predicted_temperature_scaled = model.predict(past_hours_data_scaled)
    predicted_temperature = scaler.inverse_transform(predicted_temperature_scaled)

    return predicted_temperature[0][0]


# 示例使用
model_path = 'temperature_prediction_model.h5'
data_path = 'temperature_data-2023-2024.xlsx'
target_date_str = '2024-06-03 23:00:00'

predicted_temperature = load_and_predict(model_path, data_path, target_date_str)
print(f"预测的{target_date_str}的温度为: {predicted_temperature:.2f} °C")
